package com.lmxdawn.api.common.session;

import com.alibaba.ttl.TransmittableThreadLocal;
import com.lmxdawn.api.common.api.ApiAssert;
import com.lmxdawn.api.common.api.ApiErrorCode;
import lombok.experimental.UtilityClass;

import java.util.Objects;

/**
 * 用户会话上下文
 *
 * @author jy
 * @since 2023-12-04 15:04
 */
@UtilityClass
public final class SessionContextHolder {
    
    private static final TransmittableThreadLocal<UserSession> TL = new TransmittableThreadLocal<>();
    
    /**
     * 设置用户会话信息
     *
     * @param userSession
     */
    public static void set(UserSession userSession) {
        TL.set(userSession);
    }
    
    /**
     * 从线程上下文获取用户
     *
     * @param allowNull 是否运行为null
     * @return
     */
    public static UserSession get(boolean allowNull) {
        UserSession userSession = TL.get();
        if (!allowNull && Objects.isNull(userSession)) {
            ApiAssert.fail(ApiErrorCode.UNAUTHORIZED);
        }
        return userSession;
    }
    
    public static UserSession get() {
        return get(false);
    }
    
    public static void remove() {
        TL.remove();
    }
    
    /**
     * 是否登录
     *
     * @return
     */
    public static boolean isLogin() {
        return Objects.nonNull(TL.get());
    }
    
    /**
     * 返回用户ID
     */
    public static String getId() {
        if (!isLogin()) {
            return "";
        }
        return TL.get().getId();
    }
    
    /**
     * 返回租户号
     */
    public static Long getTenantId() {
        if (!isLogin()) {
            return 0L;
        }
        return TL.get().getTenantId();
    }
    
    /**
     * 返回账号
     */
    public static String getUsername() {
        if (!isLogin()) {
            return null;
        }
        return TL.get().getUsername();
    }
    
    /**
     * 返回显示名称
     */
    public static String getDisplayName() {
        if (!isLogin()) {
            return "系统";
        }
        return TL.get().getDisplayName();
    }
    
}
